Fork me on GitHub

设计模式 - 观察者

注意:所有文章除特别说明外,转载请注明出处.

简介

当对象存在一对多的时候则使用观察者模式。如:当一个对象被修改时,则会自动通知它依赖对象。定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

提示:观察者模式无外乎两个操作,观察者订阅自己关心的主体和主体有数据变化后通知观察者们。

1.需要自定义主体,每个主体需要持有观察者列表的引用,用于在数据变更的时候通知各个观察者。

类似于发布订阅

优点

1. 观察者与被观察者之间建立一个抽象的耦合

2. 观察者模式支持广播通信

缺点

1. 过多的细节依赖,提高时间消耗和程序复杂度

2. 需要使用得当否则容易陷入循环调用

观察者模式

1.创建Subject类

import java.util.ArrayList;
import java.util.List;

public class Subject {

   private List<Observer> observers 
      = new ArrayList<Observer>();
   private int state;

   public int getState() {
      return state;
   }

   //这里表示数据变更,通知各个观察者
   public void setState(int state) {
      this.state = state;
      notifyAllObservers();
   }

   public void attach(Observer observer){
      observers.add(observer);      
   }

   public void notifyAllObservers(){
      for (Observer observer : observers) {
         observer.update();
      }
   }  
}

2.创建Observer类

public abstract class Observer {
   protected Subject subject;
   public abstract void update();
}

3.创建实体观察者类

public class BinaryObserver extends Observer{

   public BinaryObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
      System.out.println( "Binary String: " 
      + Integer.toBinaryString( subject.getState() ) ); 
   }
}

public class OctalObserver extends Observer{

   public OctalObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
     System.out.println( "Octal String: " 
     + Integer.toOctalString( subject.getState() ) ); 
   }
}

public class HexaObserver extends Observer{

   public HexaObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
      System.out.println( "Hex String: " 
      + Integer.toHexString( subject.getState() ).toUpperCase() ); 
   }
}

4.使用 Subject 和实体观察者对象

public class ObserverPatternDemo {
   public static void main(String[] args) {
      Subject subject = new Subject();

      new HexaObserver(subject);
      new OctalObserver(subject);
      new BinaryObserver(subject);

      System.out.println("First state change: 15");   
      subject.setState(15);
      System.out.println("Second state change: 10");  
      subject.setState(10);
   }
}

总结

观察者模式表示观察者订阅被观察者的状态,当被观察者状态改变的时候会通知所有订阅的观察者的过程。

本文标题:设计模式 - 观察者

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:23:23

原始链接:http://bangjinhu.github.io/undefined/设计模式 - 观察者模式 - 重点/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.